package com.neusoft.feature;

import org.junit.Test;

import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.util.Objects;

/**
 * @author lichunlong lcl253137@alibaba-inc.com
 * @desc 异常处理之try-catch
 * @date 2023-01-04
 */
public class TryCatchFeature {

    /**
     * 在Java 8之前，我们习惯于这样处理资源的关闭
     * TODO 怎么在JUnit中实现IO流的输入
     */
    @Test
    public void test1() {
        InputStreamReader reader = null;
        try {
            reader = new InputStreamReader(System.in);

            // 流的操作
            int data = reader.read();
            System.out.println(data);
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            if (Objects.nonNull(reader)) {
                try {
                    reader.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
    }

    /**
     * java 8中，可以实现资源的自动关闭。但是要求执行后必须关闭的所有资源必须在try子句中初始化，否则编译不通过
     */
    @Test
    public void test2() {
        try (InputStreamReader reader = new InputStreamReader(System.in)) {
            // do some business
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    /**
     * Java 9中，用资源语句编写try将更容易，我们可以在try子句中使用已经初始化过的资源，此时的资源是final的
     */
    @Test
    public void test3() {
        InputStreamReader reader = new InputStreamReader(System.in);
        OutputStreamWriter writer = new OutputStreamWriter(System.out);
        try (reader; writer) {
            // reader是final的，不可再被赋值
//            reader = null;
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}
